#include <bits/stdc++.h>
using namespace std;

/*
3461. 判断操作后字符串中的数字是否相等 I
已解答
简单
相关标签
premium lock icon
相关企业
提示
给你一个由数字组成的字符串 s 。重复执行以下操作，直到字符串恰好包含 两个 数字：

从第一个数字开始，对于 s 中的每一对连续数字，计算这两个数字的和 模 10。
用计算得到的新数字依次替换 s 的每一个字符，并保持原本的顺序。
如果 s 最后剩下的两个数字 相同 ，返回 true 。否则，返回 false。

 

示例 1：

输入： s = "3902"

输出： true

解释：

一开始，s = "3902"
第一次操作：
(s[0] + s[1]) % 10 = (3 + 9) % 10 = 2
(s[1] + s[2]) % 10 = (9 + 0) % 10 = 9
(s[2] + s[3]) % 10 = (0 + 2) % 10 = 2
s 变为 "292"
第二次操作：
(s[0] + s[1]) % 10 = (2 + 9) % 10 = 1
(s[1] + s[2]) % 10 = (9 + 2) % 10 = 1
s 变为 "11"
由于 "11" 中的数字相同，输出为 true。
示例 2：

输入： s = "34789"

输出： false

解释：

一开始，s = "34789"。
第一次操作后，s = "7157"。
第二次操作后，s = "862"。
第三次操作后，s = "48"。
由于 '4' != '8'，输出为 false。
 

提示：

3 <= s.length <= 100
s 仅由数字组成。
*/

// 法一
class Solution {
public:
    bool hasSameDigits(string s) {
        while (s.size() > 2) {
            // stop  下一轮
            string next_str;
            // cur 连续数字
            for (int i = 0; i < s.size() - 1; i++) {
                // change mod sum 10 convert to str
                int a = s[i] - '0';
                int b = s[i + 1] - '0';
                next_str += (char)((a + b) % 10 + '0');
            }
            s = next_str;
        }
        return s[0] == s[1];
    }
};

// 法二
class Solution {
public:
    bool hasSameDigits(string s) {
        int l = s.size();
        while (l > 2) {
            // 优化点就是从新string 改为原地
            // cur 连续数字
            for (int i = 0; i < l - 1; i++) {
                // change mod sum 10 convert to str
                s[i] = ( (s[i] - '0') + (s[i+1] - '0') ) % 10 + '0';
            }
            l--;
        }
        return s[0] == s[1];
    }
};